package net.ufrog.common.data.spring;

import net.ufrog.common.data.DataConfig;
import net.ufrog.common.utils.Strings;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

/**
 * @author ultrafrog, ufrog.net@gmail.com
 * @version 0.1, 2017-01-27
 * @since 0.1
 */
public class Domains {

    /** 构造函数 */
    private Domains() {}

    /**
     * @param page 页码
     * @param size 分页大小
     * @return 分页信息对象
     */
    public static Pageable pageable(Integer page, Integer size) {
        return new PageRequest(page(page), size(size));
    }

    /**
     * @param page 页码
     * @param size 分页大小
     * @param direction 排序方向
     * @param properties 排序属性
     * @return 分页信息对象
     */
    public static Pageable pageable(Integer page, Integer size, Sort.Direction direction, String... properties) {
        return new PageRequest(page(page), size(size), direction, properties);
    }

    /**
     * @param page 页码
     * @param size 分页大小
     * @param sort 排序对象
     * @return 分页信息对象
     */
    public static Pageable pageable(Integer page, Integer size, Sort sort) {
        return new PageRequest(page(page), size(size), sort);
    }

    /**
     * @param direction 排序方向
     * @param properties 排序属性
     * @return 排序对象
     */
    public static Sort sort(Sort.Direction direction, String... properties) {
        return new Sort(direction, properties);
    }

    /**
     * @param orders 排序数组
     * @return 排序对象
     */
    public static Sort sort(Sort.Order... orders) {
        return new Sort(orders);
    }

    /**
     * @param properties 排序属性
     * @return 排序对象
     */
    public static Sort sort(String... properties) {
        return new Sort(properties);
    }

    /**
     * @param direction 排序方向
     * @param property 排序属性
     * @return 排序
     */
    public static Sort.Order order(Sort.Direction direction, String property) {
        return new Sort.Order(direction, property);
    }

    /**
     * @param sort 排序
     * @return 排序字符串
     */
    public static String toOrderString(Sort sort) {
        StringBuilder order = Strings.builder();
        sort.forEach(o -> order.append(",").append(o.getProperty()).append(" ").append(o.getDirection().toString()));
        return order.substring(1);
    }

    /**
     * @param page 页码
     * @return 实际页码<br>当页码为无效值时返回0
     */
    public static Integer page(Integer page) {
        return (page == null || page < 0) ? 0 : page;
    }

    /**
     * @param size 分页大小
     * @return 实际分页大小<br>当分页大小为无效值时返回系统设定值
     */
    public static Integer size(Integer size) {
        return (size == null || size <= 0) ? DataConfig.getPageSize() : size;
    }
}
